
# 从 collections 模块导入 OrderedDict 类，用于创建有序字典
from collections import OrderedDict


class ContextMenuDataBuilder(object):
    """
    ContextMenuDataBuilder 类用于构建上下文菜单的数据。
    提供了添加分隔符、菜单项，重置数据和获取菜单数据等功能。
    """

    def __init__(self):
        """
        初始化 ContextMenuDataBuilder 实例。
        初始化存储菜单项的有序字典和菜单列表。
        """
        # 调用父类的构造函数
        super(ContextMenuDataBuilder, self).__init__()
        # 用于存储菜单项的有序字典
        self._storage = OrderedDict()
        # 存储菜单数据的列表
        self._menu = []

    def addSeparator(self):
        """
        向菜单中添加一个分隔符。
        """
        self._menu.append({"separator": True})

    def addEntry(self, name, title, callback=None, icon=None, parentEntry=None):
        """
        向菜单中添加一个菜单项。

        :param name: 菜单项的名称，用于唯一标识菜单项
        :param title: 菜单项显示的标题
        :param callback: 菜单项被点击时调用的回调函数，默认为 None
        :param icon: 菜单项显示的图标，默认为 None
        :param parentEntry: 父菜单项的名称，若指定则将该菜单项作为子菜单项添加，默认为 None
        :return: 返回当前实例，方便链式调用
        """
        if name not in self._menu:
            # 创建一个有序字典存储菜单项信息
            menu = OrderedDict()
            menu["name"] = name
            menu["title"] = title
            menu["icon"] = icon
            menu["callback"] = callback
            # 将菜单项信息存储到 _storage 中
            self._storage[name] = menu

            if parentEntry is not None and parentEntry in self._storage:
                # 若指定了父菜单项，则将该菜单项作为子菜单项添加到父菜单项中
                self._storage[parentEntry]["sub_menu"] = menu
            else:
                # 若未指定父菜单项，则直接添加到菜单列表中
                self._menu.append(menu)
                self._storage[name] = menu

        return self

    def reset(self):
        """
        重置菜单数据，清空存储菜单项的有序字典和菜单列表。
        原代码中 self.menu 应改为 self._menu 以避免未解析的特性引用问题。
        """
        self._storage.clear()
        # 修正：使用正确的属性名
        self._menu.clear()

    def get(self):
        """
        获取构建好的菜单数据。

        :return: 包含菜单数据的列表
        """
        return self._menu